package com.cike.sparkstudy.sql.java;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.hive.HiveContext;

public class HiveDataSource {
    @SuppressWarnings("deprecation")
    public static void main(String[] args){
        SparkConf conf = new SparkConf()
                //.setMaster("spark://bigdata")
                .setAppName("HiveDataSource");

        JavaSparkContext sc = new JavaSparkContext(conf);
        HiveContext hiveContext = new HiveContext(sc.sc());

        //hiveContext的两个功cl
        //  1、执行Hive中的HiveSQL语句
        //  2、执行HiveSQL后返回一个DataFrame
        hiveContext.sql("DROP TABLE IF EXISTS default.student_infos");

        hiveContext.sql("CREATE TABLE IF NOT EXISTS default.student_infos (name STRING, age INT)");
        //System.out.println("=======成功=======");
        // 将学生基本信息数据导入student_infos表
        hiveContext.sql("LOAD DATA "
                + "LOCAL INPATH '/usr/local/spark-study/resources/student_infos.txt' "
                + "INTO TABLE student_infos");

        // 用同样的方式给student_scores导入数据
        hiveContext.sql("DROP TABLE IF EXISTS student_scores");
        hiveContext.sql("CREATE TABLE IF NOT EXISTS student_scores (name STRING, score INT)");
        hiveContext.sql("LOAD DATA "
                + "LOCAL INPATH '/usr/local/spark-study/resources/student_scores.txt' "
                + "INTO TABLE student_scores");

        // 第二个功能，执行sql还可以返回DataFrame，用于查询

        // 执行sql查询，关联两张表，查询成绩大于80分的学生
        DataFrame goodStudentsDF = hiveContext.sql("SELECT si.name, si.age, ss.score "
                + "FROM student_infos si "
                + "JOIN student_scores ss ON si.name=ss.name "
                + "WHERE ss.score>=80");

        // 第三个功能，可以将DataFrame中的数据，理论上来说，DataFrame对应的RDD的元素，是Row即可
        // 将DataFrame中的数据保存到hive表中

        // 接着将DataFrame中的数据保存到good_student_infos表中
        hiveContext.sql("DROP TABLE IF EXISTS good_student_infos");
        goodStudentsDF.saveAsTable("good_student_infos");

        // 第四个功能，可以用table()方法，针对hive表，直接创建DataFrame

        // 然后针对good_student_infos表，直接创建DataFrame
        Row[] goodStudentRows = hiveContext.table("good_student_infos").collect();
        for(Row goodStudentRow : goodStudentRows) {
            System.out.println(goodStudentRow);
        }

        sc.close();
    }

}
